MapOverview.jsx ➔ updateMap   A
last analyzed

Complexity

Conditions 2

Size

Total Lines 9
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 7
dl 0
loc 9
rs 10
c 0
b 0
f 0
1
import React from "react";
2
import { useState, useEffect, useRef } from "react";
3
import { Searchbar, Map, MapSidebar } from "./../components";
4
import mapConfig from "../config/config.json";
5
import getCoordinates from "../models/nominatim";
6
import scooter from "../models/scooters";
7
import cities from "../models/cities";
8
import "../Map.css";
9
const startpoint = mapConfig.center;
10
11
const MapOverview = () => {
12
  const [center, setCenter] = useState(startpoint);
13
  const [zoom, setZoom] = useState(14);
14
  const [searchPhrase, setSearchPhrase] = useState("");
15
  const [isLive, setIsLive] = useState(false);
16
  const [features, setFeatures] = useState();
17
  const [scooters, setScooters] = useState([]);
18
  const [cityData, setCityData] = useState([]);
19
  const timerRef = useRef(null);
20
  timerRef.current = isLive;
21
22
  useEffect(() => {
23
    fetchScooterData();
24
  }, []);
25
26
  useEffect(() => {
27
    async function fetchCityData() {
28
      const res = await cities.getCities();
29
      const data = res.cities;
30
      setCityData(data);
31
    }
32
    fetchCityData();
33
  }, []);
34
35
  useEffect(() => {
36
    updateMap();
37
  }, [isLive]);
38
39
  async function fetchScooterData() {
40
    const res = await scooter.getScooters();
41
    const data = res.scooters;
42
    setScooters(data);
43
  }
44
45
  function updateMap() {
46
    const timer = setInterval(() => {
47
      if (timerRef.current === false) {
48
        clearInterval(timer);
49
      } else {
50
        fetchScooterData();
51
      }
52
    }, 1000);
53
  }
54
55
  const handleToggle = () => {
56
    setIsLive(!isLive);
57
  };
58
59
  const handleSearch = async () => {
60
    const result = await getCoordinates(searchPhrase);
61
    const coordArr = [result.latitude, result.longitude];
62
    setZoom(12);
63
    setFeatures(coordArr);
64
  };
65
66
  const handleFlyToArea = async (place) => {
67
    const result = await getCoordinates(place);
68
    const coordArr = [result.latitude, result.longitude];
69
    setZoom(12);
70
    setFeatures(coordArr);
71
  };
72
73
  const handleFlyTo = (coords) => {
74
    setZoom(16);
75
    setFeatures(coords);
76
  };
77
78
  return (
79
    <div className="w-full">
80
      {cityData ? (
81
        <div className="flex flex-row w-full">
82
          <div className="w-3/4">
83
            <div className="absolute  text-white z-100 leaflet-bottom pointer-events-auto bg-slate-700 p-3 rounded-tr-xl">
84
              <label class="inline-flex relative items-center cursor-pointer">
85
                <input
86
                  onClick={(e) => {
87
                    handleToggle();
88
                  }}
89
                  type="checkbox"
90
                  checked={isLive}
91
                  class="sr-only peer"
92
                />
93
                <div
94
                  class="w-11 h-6 bg-gray-800 peer-focus:outline-none
95
                  peer-focus:ring-4 peer-focus:ring-blue-300
96
                 dark:peer-focus:ring-blue-800 rounded-full peer
97
                  dark:bg-slate-500 peer-checked:after:translate-x-full 
98
                  peer-checked:after:border-white after:content-[''] 
99
                  after:absolute after:top-[2px] after:left-[2px]
100
                 after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 
101
                  after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-blue-600"
102
                ></div>
103
                <span class="ml-3 text-sm font-medium text-gray-900 dark:text-gray-300">
104
                  Live View
105
                </span>
106
              </label>
107
            </div>
108
            <Map
109
              center={center}
110
              zoom={zoom}
111
              features={features}
112
              scooters={scooters}
113
              cities={cityData}
114
              setIsLive={setIsLive}
115
            />
116
          </div>
117
          <div className="w-1/4 flex flex-col max-h-screen bg-gray-800">
118
            <div className="p-4">
119
              <Searchbar
120
                searchPhrase={searchPhrase}
121
                setSearchPhrase={setSearchPhrase}
122
                handleSearch={handleSearch}
123
              />
124
            </div>
125
            <div className="w-full overflow-scroll">
126
              <MapSidebar
127
                scooters={scooters}
128
                cities={cityData}
129
                handleFlyTo={handleFlyTo}
130
                handleFlyToArea={handleFlyToArea}
131
              />
132
            </div>
133
          </div>
134
        </div>
135
      ) : (
136
        <div>
137
          <h1>Loading</h1>
138
        </div>
139
      )}
140
    </div>
141
  );
142
};
143
144
export default MapOverview;
145